package org.sean.framework.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.service.IService;
import org.apache.ibatis.annotations.Param;
import org.sean.framework.bean.PageData;
import org.sean.framework.bean.PageQuery;

import java.util.List;

/**
 * CRUD基础服务接口
 *
 * @param <E> 数据库实体
 * @param <D> 传输层实体
 * @param <Q> 查询参数
 * @author sean.xie
 */
public interface CrudService<E, D, Q extends PageQuery> extends IService<E> {

    /**
     * 分页查询
     *
     * @param query 查询条件
     * @return 分页数据
     */
    PageData<D> pageDTO(Q query);

    /**
     * 根据条件分页筛选
     *
     * @param query        参数-分页
     * @param queryWrapper 参数-逻辑
     * @return 分页数据
     */
    PageData<D> pageDTO(Q query, @Param(Constants.WRAPPER) Wrapper<E> queryWrapper);

    /**
     * 列表查询
     *
     * @param query 查询条件
     * @return 列表数据
     */
    List<D> listDTO(Q query);

    /**
     * 列表查询
     *
     * @param queryWrapper 查询条件
     * @return 列表数据
     */
    public List<D> listByWrapper(Wrapper<E> queryWrapper);

    /**
     * 根据ID 查询
     *
     * @param id id
     * @return 实体
     */
    D getDTO(Long id);

    /**
     * 保存数据
     *
     * @param dto 实体
     * @return 保存后数据,失败时返回null
     */
    E saveDTO(D dto);

    /**
     * 根据ID修改
     *
     * @param dto 实体信息
     * @return boolean
     */
    boolean updateDTO(D dto);

    /**
     * 更加ID 删除
     *
     * @param ids id数组
     * @return 影响条数
     */
    boolean deleteByIds(Long[] ids);

    /**
     * 根据条件删除
     *
     * @param query 查询条件
     * @return 影响条数
     */
    boolean deleteByWrapper(Wrapper<E> query);

}
